package net.suplementos.negocio;

import java.util.Date;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import net.suplementos.dominio.TipoRelatorioVendas;
import net.suplementos.exception.CampoObrigatorioException;
import net.suplementos.exception.ErroInternoException;
import net.suplementos.pojo.Despesa;
import net.suplementos.pojo.Produto;
import net.suplementos.servico.GerencialServico;

public class GerencialDelegate implements GerencialServico {

    private static GerencialServico delegate;
    private InitialContext context;

    private GerencialDelegate() {
        try {
            context = new InitialContext();
        } catch (NamingException e) {
            throw new ErroInternoException(e.getMessage(), e);
        }
    }

    public static GerencialServico getInstance() {
        if (delegate == null) {
            delegate = new GerencialDelegate();
        }

        return delegate;
    }

    private GerencialServico getRemote() {
        try {
            return (GerencialServico) context.lookup("/net/suplementos/facade/Gerencial/remote");
        } catch (NamingException e) {
            throw new ErroInternoException(e.getMessage(), e);
        }
    }

    public void relatorioVendas(Date dataInicio, Date dataFim, TipoRelatorioVendas tipo) throws CampoObrigatorioException {
        getRemote().relatorioVendas(dataInicio, dataFim, tipo);
    }

    public void relatorioDespesas(Date dataInicio, Date dataFim) throws CampoObrigatorioException {
        getRemote().relatorioDespesas(dataInicio, dataInicio);
    }

    public List<Produto> notificacoesProdutosVencendo() {
        return getRemote().notificacoesProdutosVencendo();
    }

    public List<Produto> notificacoesProdutosPoucoEstoque() {
        return getRemote().notificacoesProdutosPoucoEstoque();
    }

    public List<Despesa> notificacoesContasVencendo() {
        return getRemote().notificacoesContasVencendo();
    }

    public boolean existeNotificacoesProdutosVencendo() {
        return getRemote().existeNotificacoesProdutosVencendo();
    }

    public boolean existeNotificacoesProdutosPoucoEstoque() {
        return getRemote().existeNotificacoesProdutosPoucoEstoque();
    }

    public boolean existeNotificacoesContasVencendo() {
        return getRemote().existeNotificacoesContasVencendo();
    }
}
